发布于 

Integration [数学]

Integration [数学]

2019牛客 第一场 B

题目来源:Nowcoder

分析

这道题就是一道纯粹的数学题。。题目要求计算如下公式:

\[ \frac{1}{\pi} \int_0^{\infty} \frac{1}{\prod_{i=1}^n (a_i^2 + x^2)} dx \]

首先,我们先假设一个变量:

\[ c_i = \frac{1}{\prod_{j \neq i}(a_j^2 - a_i^2)}\]

那么,其实第一个公式便可以进行如下的化简:

\[\begin{aligned} &\ \frac{1}{\pi} \int_0^{+\infty} \frac{1}{\prod_{i=1}^n (a_i^2 + x^2)} dx \\ = &\ \frac{1}{\pi} \int_0^{+\infty} \sum \frac{c_i}{a_i^2 + x^2} dx (\text{此处由题解给出,我实在不会证}) \\ = &\ \frac{1}{\pi} \sum \int_0^{+\infty} \frac{c_i}{a_i^2 + x^2} dx \\ = &\ \frac{1}{\pi} \sum \left( \frac{c_i}{a_i} \times \left. \arctan(x/a_i) \right|_0^{+\infty} \right) \\ = &\ \frac{1}{\pi} \sum \frac{c_i}{2a_i} \pi \end{aligned}\]

实现细节

这道题主要由两个细节问题:

  1. 不能频繁的进行取乘法逆元操作,否则会超时。应先乘在一起,然后再求逆元。
  2. 注意\(a_j^2 - a_i^2\)可能为负数。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include <iostream>

#define MAXN 1010
#define MOD 1000000007

using namespace std;

long long pow(long long x, long long n, long long mod)
{
long long ret = 1;
long long t = x % mod;

while (n)
{
if (n & 1)
ret = ret * t % mod;

n /= 2;
t = t * t % mod;
}

return ret;
}

long long reverse(long long x, long long mod)
{
return pow(x, mod - 2, mod);
}

long long a[MAXN];

int main()
{
ios::sync_with_stdio(false);

int n;
while (cin >> n)
{
for (int i = 1; i<=n; i++)
cin >> a[i];

long long ans = 0;
for (int i = 1; i<=n; i++)
{
long long tmp = 1;
for (int j = 1; j<=n; j++)
if (i!=j)
{
long long m = a[j] * a[j] - a[i] * a[i];
m %= MOD;
if (m<0)
m += MOD;
tmp = tmp * m % MOD;
}

tmp = tmp * 2 * a[i] % MOD;

ans = (ans + reverse(tmp, MOD)) % MOD;
}

cout << ans << endl;
}
}

本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。

本站由 [@Songer](https://blog.songer.xyz/) 创建,使用 Stellar 作为主题。